package com.finger.gulimall.product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * （
 * 整合mybatis plus
 *
 * <dependency>
 * <groupId>com.baomidou</groupId>
 * <artifactId>mybatis-plus-boot-starter</artifactId>
 * <version>3.3.1</version>
 * </dependency>
 * <p>
 * 1，导入数据库驱动
 * 2，配置数据源
 * 3，配置映射文件位置
 * 4，配置mapper扫描
 * 5，把id修改为自增
 * ）
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * <p>
 * （JSR303校验：
 * 1)、在需要校验的实体类的属性上标注 javax.validation.constraints 包下的注解
 * 2)、在需要校验的实体类前表明 @Valid 注解
 * 3)、在标注了  @Valid 注解的 实体类后边写入一个 BindingResult 接口，可用于接收错误信息
 * 4)、分组校验（在需要校验的实体类前标明 @Validated注解）：在实体类属性的注解参数groups中 指明（通过自定义接口） 在什么场景下启用校验.
 * 5)、自定义校验注解：
 *      1、引入
 *      <dependency>
 *          <groupId>javax.validation</groupId>
 *          <artifactId>validation-api</artifactId>
 *          <version>2.0.1.Final</version>
 *      </dependency>
 *      2、定义一个注解，并在注解实体上表明   @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 *
 *      @Retention(RetentionPolicy.RUNTIME)
 *      @Documented
 *      @Constraint( validatedBy = {ListValueConstraintValidator.class}
 *      )
 *      并在注解中写入 ：     String message() default "{com.finger.common.ListValue.message}";
 *      Class<?>[] groups() default {};
 *      Class<? extends Payload>[] payload() default {};
 *      并注入属性（通过填入的哪些值判断）  int[] vals() default {};
 *      3、创建一个自定义类 并实现 ConstraintValidator<ListValue, Integer> 接口，泛型中第一个参数是注解名，第二个是要校验数据的类型
 *      4、实现其方法，并在 isValid 方法中定义具体的过滤逻辑
 *      ）
 * <p>
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 使用Redisson作为redis分布式锁的方案：
 * 1）、导入依赖
 * <dependency>
 * <groupId>org.redisson</groupId>
 * <artifactId>redisson</artifactId>
 * <version>3.13.3</version>
 * </dependency>
 * 2）、配置RedissonClient，所有有关于Redisson的操作都在RedissonClient中
 * 2.2）、读写锁
 * 分布式锁
 * 闭锁
 * 信号量锁
 * <p>
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * <p>
 * 使用springcache 作为项目缓存：
 * 1）、导入依赖：
 * spring-boot-starter-cache
 * 2）、在配置文件中配置 spring.cache.type=redis
 * 3）、在启动类上添加 @EnableCaching注解
 * 4）、在需要的方法上边添加注解并指定在redis中的分区和名字
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 解决分布式下session域共享不一致问题
 * 整合SpringSession
 *
 * 1）、导入session-data-redis依赖，该依赖又依赖与spirng-cache和redis依赖
 *   <dependency>
 *        <groupId>org.springframework.session</groupId>
 *        <artifactId>spring-session-data-redis</artifactId>
 *        <version>2.3.0.RELEASE</version>
 *    </dependency>
 *
 * 2）、在容器中添加CookieSerializer、RedisSerializer组件
 * 3）、在配置文件中指定spring: session: store-type: redis
 * 4）、在启动类上添加@EnableRedisHttpSession开启使用redis存储session
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 */

@EnableRedisHttpSession // 开启session的redis存储类型
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.finger.gulimall.product.feign"})
@SpringBootApplication
@ComponentScan("com.finger")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
